package org.jeecg.modules.generator.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.jeecg.common.util.StringUtils;
import org.jeecg.modules.generator.entity.SysGenerateItemConfigEntity;
import org.jeecg.modules.generator.entity.SysGenerateTabColumn;
import org.jeecg.modules.generator.entity.SysGenerateFieldInfoEntity;
import org.jeecg.modules.generator.mapper.SysGenerateTabColumnMapper;
import org.jeecg.modules.generator.service.SysGenerateItemConfigService;
import org.jeecg.modules.generator.service.SysGenerateTabColumnService;
import org.jeecg.modules.generator.service.SysGenerateFieldInfoService;
import cn.hutool.core.map.MapUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

@Service
public class SysGenerateTabColumnServiceImpl extends ServiceImpl<SysGenerateTabColumnMapper, SysGenerateTabColumn> implements SysGenerateTabColumnService {

    @Autowired
    private SysGenerateFieldInfoService generateFieldInfoService;
    @Autowired
    private SysGenerateItemConfigService generateItemConfigService;

    @Override
    public List<SysGenerateFieldInfoEntity> getColumnFileById(String tableId, String fieldName) {
        LambdaQueryWrapper<SysGenerateFieldInfoEntity> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SysGenerateFieldInfoEntity::getTableId,tableId);
        queryWrapper.eq(SysGenerateFieldInfoEntity::getFieldName,fieldName);
        queryWrapper.orderByAsc(SysGenerateFieldInfoEntity::getSort);
        List<SysGenerateFieldInfoEntity> tbGenerateFieldInfoEntityList = generateFieldInfoService.list(queryWrapper);
        LambdaQueryWrapper<SysGenerateItemConfigEntity> configEntityQueryWrapper = new LambdaQueryWrapper<>();
        configEntityQueryWrapper.orderByAsc(SysGenerateItemConfigEntity::getSort);
        List<SysGenerateItemConfigEntity> tbGenerateItemConfigEntityList  = generateItemConfigService.list(configEntityQueryWrapper);
        for (SysGenerateItemConfigEntity sysGenerateItemConfigEntity : tbGenerateItemConfigEntityList) {
            SysGenerateFieldInfoEntity sysGenerateFieldInfoEntity  = tbGenerateFieldInfoEntityList.stream().filter(item->item.getFieldItemName().equals(sysGenerateItemConfigEntity.getFieldName())).findFirst().orElse(null);
            if(sysGenerateFieldInfoEntity == null){
                SysGenerateFieldInfoEntity generateFieldInfoEntity = tbGenerateFieldInfoEntityList.get(0);
                SysGenerateFieldInfoEntity primaryInfoEntity = new SysGenerateFieldInfoEntity(generateFieldInfoEntity.getFieldName(), generateFieldInfoEntity.getColumnName(), generateFieldInfoEntity.getFieldRemark(), "1", tableId,sysGenerateItemConfigEntity.getSort());
                primaryInfoEntity.setFieldItemName(sysGenerateItemConfigEntity.getFieldName());
                primaryInfoEntity.setFieldItemRemark(sysGenerateItemConfigEntity.getFieldRemark());
                /**主键页面属性*/
                primaryInfoEntity.setRequired(sysGenerateItemConfigEntity.getRequired());  //必填
                primaryInfoEntity.setValueType(sysGenerateItemConfigEntity.getValueType());
                primaryInfoEntity.setFieldItemValue(sysGenerateItemConfigEntity.getDefaultValue()); //必填默认值（取数据库配置）
                primaryInfoEntity.setDictType(sysGenerateItemConfigEntity.getDictType());
                tbGenerateFieldInfoEntityList.add(primaryInfoEntity);
            }
        }
        return tbGenerateFieldInfoEntityList;
    }

    @Override
    public List<Map<String,Object>> queryByFieldItemInfoByTbableId(String tableId) {
        List<String> itemFieldNameList = baseMapper.queryAllfieldItemNameByTbableId();
        StringBuffer pivotParams = new StringBuffer();
        for (int i=0; i<itemFieldNameList.size(); i++) {
            if(i==0){
                pivotParams.append("'"+itemFieldNameList.get(i)+"' "+StringUtils.replaceUpperCaseToUnderLine(itemFieldNameList.get(i)));
            }else {
                pivotParams.append(",'"+ itemFieldNameList.get(i)+"' "+StringUtils.replaceUpperCaseToUnderLine(itemFieldNameList.get(i)));
            }
        }
        List<Map<String,Object>> fieldItemList = baseMapper.queryByFieldItemInfoByTbableId(tableId,pivotParams.toString());
        for (int i = 0;i < fieldItemList.size(); i++) {
            Map<String, Object> resultMap = new HashMap<>(); //改变后的对象，每一个对象都是重新new的
            Map<String, Object> tempMap = fieldItemList.get(i); //集合中的每一个对象
            Set<String> keySet = tempMap.keySet(); //Map.keySet()方法：获取Map集合中的键名
            for (String key : keySet) { //遍历键名
                resultMap.put(key.toLowerCase(), tempMap.get(key)); //key小写，value不变：String.toLowerCase()
            }
            fieldItemList.set(i, resultMap); //将每一个改变后的对象替换原对象
        }
        /**下划线转驼峰*/
        List<Map<String,Object>> mapsList  = fieldItemList.stream()
                .map(MapUtil::toCamelCaseMap)
                .collect(Collectors.toList());
        return mapsList;
    }

    @Override
    public List<SysGenerateTabColumn> queryByColumnInfoByTbable(String tableId) {
        List<String> itemFieldNameList = baseMapper.queryAllfieldItemNameByTbableId();
        StringBuffer pivotParams = new StringBuffer();
        for (int i=0; i<itemFieldNameList.size(); i++) {
             if(i==0){
                 pivotParams.append("'"+itemFieldNameList.get(i)+"' "+StringUtils.replaceUpperCaseToUnderLine(itemFieldNameList.get(i)));
            }else {
                 pivotParams.append(",'"+ itemFieldNameList.get(i)+"' "+StringUtils.replaceUpperCaseToUnderLine(itemFieldNameList.get(i)));
             }
        }
        List<SysGenerateTabColumn> sysGenerateTabColumnList = baseMapper.queryByColumnInfoByTbableId(tableId,pivotParams.toString());
        return sysGenerateTabColumnList;
    }

    @Override
    public void columnSave(Map<String, String> dataMap) {
        String tableId = dataMap.get("tableId");
        String fieldName = dataMap.get("fieldName");
        LambdaQueryWrapper<SysGenerateFieldInfoEntity> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SysGenerateFieldInfoEntity::getTableId,tableId);
        queryWrapper.eq(SysGenerateFieldInfoEntity::getFieldName,fieldName);
        List<SysGenerateFieldInfoEntity> tbGenerateFieldInfoEntityList = generateFieldInfoService.list(queryWrapper);
        for (SysGenerateFieldInfoEntity generateFieldInfoEntity : tbGenerateFieldInfoEntityList) {
            for (Map.Entry<String, String> stringStringEntry : dataMap.entrySet()) {
                if(generateFieldInfoEntity.getFieldItemName().equals(stringStringEntry.getKey())){
                    generateFieldInfoEntity.setFieldItemValue(stringStringEntry.getValue());
                    break;
                }
            }
        }
        List<SysGenerateFieldInfoEntity> newGenerateFieldInfoEntityList = new ArrayList<>();
        List<SysGenerateItemConfigEntity> tbGenerateItemConfigEntityList  = generateItemConfigService.list();
        for (Map.Entry<String, String> stringStringEntry : dataMap.entrySet()) {
            SysGenerateFieldInfoEntity sysGenerateFieldInfoEntity  = tbGenerateFieldInfoEntityList.stream().filter(item->item.getFieldItemName().equals(stringStringEntry.getKey())).findFirst().orElse(null);
            if(sysGenerateFieldInfoEntity == null && !"tableId".equals(stringStringEntry.getKey()) && !"fieldName".equals(stringStringEntry.getKey())){
                SysGenerateItemConfigEntity generateItemConfigEntity   = tbGenerateItemConfigEntityList.stream().filter(item->item.getFieldName().equals(stringStringEntry.getKey())).findFirst().orElse(null);
                SysGenerateFieldInfoEntity generateFieldInfoEntity = tbGenerateFieldInfoEntityList.get(0);
                SysGenerateFieldInfoEntity primaryInfoEntity = new SysGenerateFieldInfoEntity(generateFieldInfoEntity.getFieldName(), generateFieldInfoEntity.getColumnName(), generateFieldInfoEntity.getFieldRemark(), "1", tableId,(generateItemConfigEntity.getSort()+6));
                primaryInfoEntity.setFieldItemName(generateItemConfigEntity.getFieldName());
                primaryInfoEntity.setFieldItemRemark(generateItemConfigEntity.getFieldRemark());
                /**主键页面属性*/
                primaryInfoEntity.setRequired(generateItemConfigEntity.getRequired());  //必填
                primaryInfoEntity.setValueType(generateItemConfigEntity.getValueType());
                primaryInfoEntity.setFieldItemValue(generateItemConfigEntity.getDefaultValue()); //必填默认值（取数据库配置）
                primaryInfoEntity.setDictType(generateItemConfigEntity.getDictType());
                primaryInfoEntity.setFieldItemValue(stringStringEntry.getValue());
                newGenerateFieldInfoEntityList.add(primaryInfoEntity);
            }
        }
        generateFieldInfoService.updateBatchById(tbGenerateFieldInfoEntityList);
        generateFieldInfoService.saveBatch(newGenerateFieldInfoEntityList);
    }
}
